{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "a7ab38ef",
   "metadata": {},
   "source": [
    "# 本周学习目标\n",
    "> 1.函数的定义\n",
    "> 2.函数的使用\n",
    "> 3.函数的参数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3d9c7249",
   "metadata": {},
   "source": [
    "### 函数的定义\n",
    "> 定义一个函数的一般步骤"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e77e777e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 1 1 2 3 5 8 \n"
     ]
    }
   ],
   "source": [
    "a,b = 0,1\n",
    "while a < 10:\n",
    "    print(a, end=' ')#0 1 1 2..\n",
    "    a, b = b, a+b #a = 1 a = 1 b = 2 a = 2 b = 3\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "fbfd931b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 1 1 2 3 5 8 13 21 34 \n"
     ]
    }
   ],
   "source": [
    "a,b = 0,1\n",
    "while a < 50:\n",
    "    print(a, end=' ')#0 1 1 2..\n",
    "    a, b = b, a+b #a = 1 a = 1 b = 2 a = 2 b = 3\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "40f69a9e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 1 1 2 3 5 8 13 21 34 55 89 \n"
     ]
    }
   ],
   "source": [
    "a,b = 0,1\n",
    "while a < 100:\n",
    "    print(a, end=' ')#0 1 1 2..\n",
    "    a, b = b, a+b #a = 1 a = 1 b = 2 a = 2 b = 3\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "114b42ea",
   "metadata": {},
   "outputs": [],
   "source": [
    "#我想重复使用某一功能（避免重复）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "927cac36",
   "metadata": {},
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "invalid syntax (<ipython-input-9-06f464921cf3>, line 1)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;36m  File \u001b[1;32m\"<ipython-input-9-06f464921cf3>\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m    >  1. 定义函数的一般方法：\u001b[0m\n\u001b[1;37m    ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n"
     ]
    }
   ],
   "source": [
    ">  1. 定义函数的一般方法：\n",
    "...\n",
    "def function_name(): # 1.function_name 遵循变量定义的规则 区别数学函数==> f(x) python的函数可以自定义名称\n",
    "    \"\"\"函数的注释\"\"\"# 2.函数的注释可以和使用者交流\n",
    "       函数体       # 3.函数体要和定义函数保持一定的tab缩进\n",
    "..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "1bacc418",
   "metadata": {},
   "outputs": [],
   "source": [
    "def fib(n):  \n",
    "    \"\"\"Print a Fibonacci series up to n. \"\"\"\n",
    "    a, b = 0, 1\n",
    "    while a < n:\n",
    "        print(a, end=' ')#0 1 1 2 \n",
    "        a, b = b, a+b #a=1 a=1 b=2\n",
    "        print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "28a7a33f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 \n",
      "1 \n",
      "1 \n",
      "2 \n",
      "3 \n",
      "5 \n",
      "8 \n"
     ]
    }
   ],
   "source": [
    "fib(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "59ec8361",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 \n",
      "1 \n",
      "1 \n",
      "2 \n",
      "3 \n",
      "5 \n",
      "8 \n",
      "13 \n",
      "21 \n",
      "34 \n"
     ]
    }
   ],
   "source": [
    "fib(50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d079bcdb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 \n",
      "1 \n",
      "1 \n",
      "2 \n",
      "3 \n",
      "5 \n",
      "8 \n",
      "13 \n",
      "21 \n",
      "34 \n",
      "55 \n",
      "89 \n"
     ]
    }
   ],
   "source": [
    "fib(100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "893edcf9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1. 请大家写一个函数 实现 hello world\n",
    "# 2. 请大家写一个函数 实现hello username"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "922e01bd",
   "metadata": {},
   "outputs": [],
   "source": [
    "def hello():\n",
    "    \"\"\"打印你好，世界\"\"\"\n",
    "    print(\"hello,world!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "b920b0f2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hello,world!\n"
     ]
    }
   ],
   "source": [
    "hello()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "178365b0",
   "metadata": {},
   "outputs": [],
   "source": [
    "def hello_user(username):\n",
    "    \"\"\"打印，你好，xxx同学\"\"\"\n",
    "    print(\"你好, \"+username.title()+\"同学\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "21ba6e9f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "你好, Jack同学\n"
     ]
    }
   ],
   "source": [
    "hello_user(\"jack\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b88429bf",
   "metadata": {},
   "source": [
    "* 思考：函数是否必须有参数？\n",
    "* 注意：\n",
    "    > 1.在第一行定义函数中，不需要任何信息就能完成工作，因此括号是空的（即使如此，括号不能少）\n",
    "    > 2.要调用函数，可以依次指定函数名以及括号括起的必要信息。在第五行代码中，因此函数hello（）括号中不需要任何信息，只要输入hello即可。和预期效果一样 打印hello world!\n",
    "   "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "26a85058",
   "metadata": {},
   "source": [
    "## 3.函数的参数\n",
    "\n",
    "\n",
    "> 1.形式参数：定义函数时，写在 function_name 括号里的参数\n",
    ">> 1.定义函数时，形式参数不占用空间\n",
    "> 2.实际参数：调用函数，写在 function_name 括号里的参数\n",
    ">> 2.在使用函数时，形式参数被分配空间，变为实际参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "3cb5265a",
   "metadata": {},
   "outputs": [],
   "source": [
    "def describe_pet(animal_type,pet_name):\n",
    "    \"\"\"显示宠物信息\"\"\"\n",
    "    print(\"\\nI have a\" + animal_type +\".\")\n",
    "    print(\"My\" + animal_type +\"’s name is\"+pet_name.title() + \".\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "e40d515d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "I have adog.\n",
      "Mydog’s name is豆豆.\n"
     ]
    }
   ],
   "source": [
    "describe_pet(\"dog\",\"豆豆\") #\"dog \"豆豆” 实际参数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7ffe7e07",
   "metadata": {},
   "source": [
    "* 当函数具有多个参数时\n",
    "\n",
    "> 1.位置参数\n",
    ">> 1.形式参数有先后顺序。函数调用过程中应考虑参数的先后顺序，避免出现顺序错误的笑话\n",
    ">> 2.调用函数过程中要考虑吧形式参数的个数\n",
    "> 2.关键字参数\n",
    ">> 1.调用参数时，通过赋值的方式传递给定义好的形参变量数据\n",
    ">> 2.关键字参数不考虑先后顺序，因为是指定变量赋值\n",
    "> 3.默认参数\n",
    ">> 1.在形式参数中，提前预先设置一个用户可能使用的参数值\n",
    ">> 2.用户在使用/调用函数时，可以省略一个不给默认参数值\n",
    ">> 3.用户给默认参数赋值，将替换默认参数的值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "28d272ee",
   "metadata": {},
   "outputs": [],
   "source": [
    " def describe_pet(animal_type,pet_name): #animal_type,pet_name 是形式参数\n",
    "        \"\"\"显示宠物信息\"\"\"\n",
    "        print(\"\\nI have a\" + animal_type + \".\")\n",
    "        print(\"My\" +animal_type +\"’s name is\"+pet_name.title() + \".\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "b66040e3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "I have adog.\n",
      "Mydog’s name is豆豆.\n"
     ]
    }
   ],
   "source": [
    "# 在使用 describe_pet()函数时 需要考虑参数的位置，从而进行参数数据的输入（实参的调用）\n",
    "describe_pet(\"dog\",\"豆豆\")# 要根据 形式参数的位置先后顺序 先写 animal_type,再写pet_name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "99bcc2e0",
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "describe_pet() missing 2 required positional arguments: 'animal_type' and 'pet_name'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-23-f95e5f55e3d1>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mdescribe_pet\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m: describe_pet() missing 2 required positional arguments: 'animal_type' and 'pet_name'"
     ]
    }
   ],
   "source": [
    "describe_pet()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "8f362f33",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "I have adog.\n",
      "Mydog’s name is豆豆.\n"
     ]
    }
   ],
   "source": [
    "# 关键字参数使用\n",
    "\n",
    "describe_pet(pet_name=\"豆豆\",animal_type=\"dog\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "648b54c7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 默认参数\n",
    "def describe_pet(animal_type,pet_name):#anmimal_type,pet_name是形式参数\n",
    "    \"\"\"显示宠物信息\"\"\"\n",
    "    prin"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "791f224b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "I have a豆豆.\n",
      "My豆豆’s name isCat.\n"
     ]
    }
   ],
   "source": [
    "describe_pet(\"豆豆\",\"cat\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "7f57e991",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hello\n",
      "hello\n"
     ]
    }
   ],
   "source": [
    "print(\"hello\",'\\n',\"hello\",sep='')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "bacaf928",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on built-in function print in module builtins:\n",
      "\n",
      "print(...)\n",
      "    print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n",
      "    \n",
      "    Prints the values to a stream, or to sys.stdout by default.\n",
      "    Optional keyword arguments:\n",
      "    file:  a file-like object (stream); defaults to the current sys.stdout.\n",
      "    sep:   string inserted between values, default a space.\n",
      "    end:   string appended after the last value, default a newline.\n",
      "    flush: whether to forcibly flush the stream.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(print)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f4acf39",
   "metadata": {},
   "source": [
    "------\n",
    "参数使用过程中的思考与问题：\n",
    "\n",
    "> 1.思考：关键字参数和位置参数是否可以一起使用？\n",
    ">> 1.positional argument follows keyword argument(位置参数<font style=\"color:red\">均</font>要放在关键字参数前面\n",
    ">> 2.test1()got multiple values for argumen 'x'(映射， 不能出现 ,multiple values(多重值） ）\n",
    "> 2.定义函数：默认参数和非参数的先后关系\n",
    ">> 1.non_default argument follows default argument(非默认参数均要放在默认参数前面）\n",
    "------\n",
    "* 以下为测试代码:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "383b4816",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 案例一\n",
    "def test1(x,y,z):\n",
    "    \"\"\"打印xyz的值\"\"\"\n",
    "    print(x)\n",
    "    print(y)\n",
    "    print(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "2bd1fee0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n",
      "3\n",
      "4\n"
     ]
    }
   ],
   "source": [
    "test1(x=2,y=3,z=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "741af1e7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n",
      "3\n",
      "4\n"
     ]
    }
   ],
   "source": [
    "test1(2,y=3,z=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "73fe6b32",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n",
      "3\n",
      "4\n"
     ]
    }
   ],
   "source": [
    "test1(2,z=4,y=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "00f48753",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n",
      "3\n",
      "4\n"
     ]
    }
   ],
   "source": [
    "test1(2,z=4,y=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "b80a5010",
   "metadata": {},
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "invalid syntax (<ipython-input-19-56d6378ea1cb>, line 2)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;36m  File \u001b[1;32m\"<ipython-input-19-56d6378ea1cb>\"\u001b[1;36m, line \u001b[1;32m2\u001b[0m\n\u001b[1;33m    def test1(x,y,z=3)\u001b[0m\n\u001b[1;37m                      ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n"
     ]
    }
   ],
   "source": [
    "# 案例二\n",
    "def test1(x,y,z=3)\n",
    "    \"\"\"打印xyz的值\"\"\"\n",
    "    print(x)\n",
    "    print(y)\n",
    "    print(z) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "84f6f76a",
   "metadata": {},
   "outputs": [],
   "source": [
    "def search4vowels(word):\n",
    "    \"\"\"判断输入文本中出现的元音字母有哪些\"\"\"\n",
    "    vowels = set(\"aeiou\")\n",
    "    word = set(word)\n",
    "    print(vowels & word)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "d3778a01",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'o', 'a'}\n"
     ]
    }
   ],
   "source": [
    "search4vowels(\"jsahdohasod\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "ebfbcf03",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'o', 'i', 'a'}\n"
     ]
    }
   ],
   "source": [
    "search4vowels(\"dsaijdasjdoias\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8f654911",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
